データ型:REFERENCE TO
重要
コンパイラバージョン> = V3.3.0.0では、参照は初期化されます(0)。
重要
参照がデバイス入力を参照している場合、そのアクセスは書き込みアクセスとして適用されます。コードが生成されると、コンパイラの警告が発生します: "...invalid assignment target
"。
例: rInput REF= Input;
この種の構成が必要な場合は、最初に入力値をコピーする必要があります(例: rInput
)書き込みアクセス権を持つ変数に。
との参照 REFERENCE
データ型は暗黙的に別のオブジェクトを参照します。割り当ては、 REF=
オペレーター。アクセスされると、参照は暗黙的に逆参照されるため、特別なコンテンツ演算子は必要ありません。 ^
ポインタなど。
構文
<identifier> : REFERENCE TO <data type> ; <data type>: base type of the reference
PROGRAM PLC_PRG VAR rspeA : REFERENCE TO DUT_SPECIAL; pspeA : POINTER TO DUT_SPECIAL; speB : DUT_SPECIAL; END_VAR rspeA REF= speB; // Reference rspeA is alias for speB. The code corresponds to pspeA := ADR(speB); rspeA := speD; // The code corresponds to pspeA^ := speD;
ariTest : ARRAY[0..9] OF REFERENCE TO INT; priTest : POINTER TO REFERENCE TO INT; rriTest : REFERENCE TO REFERENCE TO INT; rbitTest : REFERENCE TO BIT;
参照型は、配列、ポインター、または参照の基本型として使用しないでください。さらに、参照はビット変数を参照してはなりません。これらの種類の構造は、コンパイラエラーを生成します。
注記
識別子とそのエイリアスを使用して同じメモリセルに同時にアクセスすると、プログラムの可読性が困難になります。
例: speB
と rspeA
ヒント
への参照とポインタ BIT
変数は 無効 宣言、および基本型の配列要素 BIT
。
参照が割り当てられている場合 :=
の場合、参照が左側、右側、または両側にあるかに関係なく、値は常にコピーされます。
Ref := value
値を書き込みますvalue
参照が指す場所に移動します。ポインタ表記では次のようになります。Ref^ := value
value := Ref
参照が指す値を後に書き込みますvalue
。ポインタ表記では次のようになります。value := Ref^
Ref1 := Ref2
値を書き込みますRef2
に指差す。場所でRef1
に指差す。ポインタ表記では次のようになります。Ref1^ := Ref2^
いつ REF=
が使用される場合、アドレスは常に適用され、左側に参照が存在する必要があります。
Ref REF= value
: 参照先は次のとおりです。value
。ポインタ表記では次のようになります。Ref :=ADR(value)
Ref1 REF= Ref2
:Ref1
と同じ値を指しますRef2
。ポインタ表記では次のようになります。Ref1 := Ref2
Value REF = Ref
コンパイルエラーが発生する
ヒント
宣言では、 REFERENCE TO INT REF= value
のように振る舞う REFERENCE TO INT := value
。
参照とポインタの比較
使いやすさ:
参照は、間接参照せずに、参照されるオブジェクトのコンテンツに直接アクセスできます。
値を渡すときのより細かく単純な構文:
ポインタの代わりにアドレス演算子なしで参照を渡す関数ブロックの呼び出し
例:
fbDoIt(riInput:=iValue);
それ以外の:
fbDoIt_1(piInput:=ADR(iValue));
型安全性:
2つの参照を割り当てる場合、コンパイラーはそれらの基本タイプが一致するかどうかをチェックします。ポインタの場合、これはチェックされません。
参照の有効性のテスト
演算子を使用できます __ISVALIDREF
参照が有効な値(0に等しくない値を意味する)を指しているかどうかを確認します。
構文
<boolean variable name> := __ISVALIDREF( <reference name> );
<reference name>
:で宣言された識別子 REFERENCE TO
ブール変数は TRUE
参照が有効な値を指している場合。それ以外の場合は FALSE
。
PROGRAM PLC_PRG VAR iAlfa : INT; riBravo : REFERENCE TO INT; riCharlie : REFERENCE TO INT; bIsRef_Bravo : BOOL := FALSE; bIsRef_Charlie : BOOL := FALSE; END_VAR iAlfa := iAlfa + 1; riBravo REF= iAlfa; riCharlie REF= 0; bIsRef_Bravo := __ISVALIDREF(riBravo); (* becomes TRUE, because riBravo references to iAlfa, which is non-zero *) bIsRef_Charlie := __ISVALIDREF(riCharlie); (* becomes FALSE, because riCharlie is set to 0 *)
ヒント
コンパイラバージョン3.5.7.40以降では、暗黙的な監視機能 CheckPointer タイプの変数に作用します REFERENCE TO
ポインタ変数の場合と同じように。